# -*-coding: Utf-8 -*-
# @File : test .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time：2023/8/13
from minio.notificationconfig import NotificationConfig, QueueConfig, PrefixFilterRule

from py_sdk_minio import *
import settings

# 初始化存储桶
'''
初始化存储桶 必传参数(settings.py)
    # endpoint指定的是你Minio的远程IP及端口
    ENDPOINT = 
    # accesskey指定的是你的Minio服务器访问key
    ACCESS_KEY = 
    # secret_key指定的是你登录时需要用的key，类似密码
    SECRET_KEY = 
    # secure指定是否以安全模式创建Minio连接,建议为False
    SECURE = False
    # 必须指定一个默认存储桶名称
    BUCKET_NAME = 
'''

# 创建连接桶对象 __init__(self, endpoint, access_key, secret_key, bucket_name, secure=False)
bucket = BucketOperation(endpoint=settings.ENDPOINT, access_key=settings.ACCESS_KEY, secret_key=settings.SECRET_KEY,
                         bucket_name=settings.BUCKET_NAME, secure=settings.SECURE)

# （1）检查桶，默认不创建 -- create_bucket(self, tag_bucket_name=None)
'''
非必传参数
    tag_bucket_name : 存储桶名称
返回结果
    {'result': True, 'tag_bucket_name': None, 'msg': '目标存储桶 testbucket 已经存在', 'msg_list': []}
'''
# res = bucket.create_bucket()
# print(res)

# （2）创建桶，主动创建 -- create_bucket(self, tag_bucket_name=None)
'''
必传参数
    tag_bucket_name : 存储桶名称
返回结果
    {'result': True, 'tag_bucket_name': 'test5', 'msg': '目标存储桶 test5 创建成功', 'msg_list': []}
'''
# tag_bucket_name = 'test5'
# res = bucket.create_bucket(tag_bucket_name=tag_bucket_name)
# print(res)

# （3）获取所有桶列表 -- get_bucket_list(self, tag_bucket_name=None)
'''
非必传参数
    tag_bucket_name : 存储桶名称
返回结果
    {'result': True, 'tag_bucket_name': None, 'msg': '存储桶列表获取成功', 'msg_list': [
    {'bucket_name': 'test1', 'bucket_create_time_utc': '2023-08-12 08:55:10','bucket_create_time_sh': '2023-08-12 16:55:10'},
    {'bucket_name': 'test2', 'bucket_create_time_utc': '2023-08-12 13:19:30','bucket_create_time_sh': '2023-08-12 21:19:30'},
    {'bucket_name': 'test4', 'bucket_create_time_utc': '2023-08-13 03:19:34','bucket_create_time_sh': '2023-08-13 11:19:34'},
    {'bucket_name': 'test5', 'bucket_create_time_utc': '2023-08-13 03:19:57','bucket_create_time_sh': '2023-08-13 11:19:57'},
    {'bucket_name': 'testbucket', 'bucket_create_time_utc': '2023-08-12 05:18:30','bucket_create_time_sh': '2023-08-12 13:18:30'}
    ]}
'''
# res = bucket.get_bucket_list()
# print(res)

# （4）指定存储桶访问 -- get_bucket_list(self, tag_bucket_name=None)
'''
选传参数
    tag_bucket_name : 存储桶名称
返回结果
    {'result': True, 'tag_bucket_name': 'test1', 'msg': '存储桶列表获取成功', 'msg_list': [
    {'bucket_name': 'test1', 'bucket_create_time_utc': '2023-08-12 08:55:10','bucket_create_time_sh': '2023-08-12 16:55:10'},
    {'bucket_name': 'test2', 'bucket_create_time_utc': '2023-08-12 13:19:30','bucket_create_time_sh': '2023-08-12 21:19:30'},
    {'bucket_name': 'test4', 'bucket_create_time_utc': '2023-08-13 03:19:34','bucket_create_time_sh': '2023-08-13 11:19:34'},
    {'bucket_name': 'test5', 'bucket_create_time_utc': '2023-08-13 03:19:57','bucket_create_time_sh': '2023-08-13 11:19:57'},
    {'bucket_name': 'testbucket', 'bucket_create_time_utc': '2023-08-12 05:18:30','bucket_create_time_sh': '2023-08-12 13:18:30'}
    ]}
'''
# tag_bucket_name = 'test1'
# res = bucket.get_bucket_list(tag_bucket_name=tag_bucket_name)
# print(res)

# （5）删除指定桶 -- get_remove_bucket(self, tag_bucket_name=None)
'''
必传参数
    tag_bucket_name : 删除存储桶名称
返回结果
    无返回结果，但是数据库发生变化，指定桶被删除
'''
# tag_bucket_name = 'test5'
# bucket.get_remove_bucket(tag_bucket_name=tag_bucket_name)

# （6）列出目标存储桶中所有对象 -- get_bucket_files(self, tag_bucket_name)
'''
可选传参数
    tag_bucket_name : 删除存储桶名称
返回结果
    {'result': True, 'tag_bucket_name': None, 'msg': '目标存储桶 testbucket 获取所有对象成功', 'msg_list': [
    {'obj_bucket_name': 'testbucket', 'obj_name': '驿站.png', 'last_modified_utc': '2023-08-13 03:52:26',
     'last_modified_sh': '2023-08-13 11:52:26', 'etag': '09ecc593ce0d0228a9657a85863ed0be', 'size': 6522,
     'content_type': None},
    {'obj_bucket_name': 'testbucket', 'obj_name': '驿站.png', 'last_modified_utc': '2023-08-13 03:52:26',
     'last_modified_sh': '2023-08-13 11:52:26', 'etag': '09ecc593ce0d0228a9657a85863ed0be', 'size': 6522,
     'content_type': None},
    {'obj_bucket_name': 'testbucket', 'obj_name': '驿站.png', 'last_modified_utc': '2023-08-13 03:52:26',
     'last_modified_sh': '2023-08-13 11:52:26', 'etag': '09ecc593ce0d0228a9657a85863ed0be', 'size': 6522,
     'content_type': None},
    {'obj_bucket_name': 'testbucket', 'obj_name': '驿站.png', 'last_modified_utc': '2023-08-13 03:52:26',
     'last_modified_sh': '2023-08-13 11:52:26', 'etag': '09ecc593ce0d0228a9657a85863ed0be', 'size': 6522,
     'content_type': None}]}
'''
# res = bucket.get_bucket_files()

# tag_bucket_name = 'test2'
# res = bucket.get_bucket_files(tag_bucket_name=tag_bucket_name)
# print(res)


# （7）列出存储桶中未完整上传的对象(废除) -- get_list_incomplete_uploads(self, tag_bucket_name=None)
'''
必传参数
    tag_bucket_name : 指定存储桶名称
返回结果

'''
# tag_bucket_name = 'test5'
# bucket.get_list_incomplete_uploads(tag_bucket_name=tag_bucket_name)

# （8）给指定的存储桶设置存储桶策略 -- get_set_bucket_policy(self, tag_bucket_name, policy)
'''
必传参数
    tag_bucket_name: 指定桶名称
    policy: 存储桶策略
返回结果
    成功 ：{'result': True, 'tag_bucket_name': 'test1', 'msg': '目标存储桶 存储策略 设置成功', 'msg_list': []}
    失败 ： {'result': False, 'tag_bucket_name': 'test2', 'msg': '目标存储桶 test2 设置存储策略失败', 'msg_list': [], 'error': S3Error('S3 operation failed; code: MalformedPolicy, message: bucket name does not match, resource: /test2, request_id: 177AD5BFADE2D9ED, host_id: 901192593c8d4aebefcd5e1ffb207b1846522d03b1e9cb2132c2770ef491581c, bucket_name: test2')}
'''
# policy = """
#             {
#                 "Version": "2012-10-17",
#                 "Statement": [
#                     {
#                         "Effect": "Allow",
#                         "Principal": {
#                             "AWS": "arn:aws:iam::123456789012:user/Alice"
#                         },
#                         "Action": [
#                             "s3:GetObject",
#                             "s3:PutObject"
#                         ],
#                         "Resource": "arn:aws:s3:::test1/*"
#                     }
#
#                 ]
#             }
#             """
#
# tag_bucket_name = 'test2'
# res = bucket.get_set_bucket_policy(tag_bucket_name=tag_bucket_name, policy=policy)
# print(res)
# tag_bucket_name = 'test3'
# bucket.bucket_policy(tag_bucket_name=tag_bucket_name)


# （9）获取存储桶的当前策略 -- bucket_policy(self, tag_bucket_name=None)
'''
必传参数
    tag_bucket_name : 指定存储桶名称
返回结果
    {'result': True, 'tag_bucket_name': 'test1', 'msg': '目标存储桶 test1 获取存储策略成功', 'msg_list': [], 'policy': '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":["arn:aws:iam::123456789012:user/Alice"]},"Action":["s3:PutObject","s3:GetObject"],"Resource":["arn:aws:s3:::test1/*"]}]}'}

'''
# tag_bucket_name = 'test1'
# res = bucket.bucket_policy(tag_bucket_name=tag_bucket_name)
# print(res)

# （10）获取存储桶的通知配置 -- get_bucket_notification(self, tag_bucket_name=None)
'''
必传参数
    tag_bucket_name : 指定存储桶名称
返回结果
    {'result': True, 'tag_bucket_name': 'test1', 'msg': '目标存储桶 test1 通知配置 获取成功', 'msg_list': [], 'notification': <minio.notificationconfig.NotificationConfig object at 0x00000253A47F3A60>}

'''

# tag_bucket_name = 'test1'
# res = bucket.get_bucket_notification(tag_bucket_name=tag_bucket_name)
# notification = res.get('notification')
# print(res)
# print(notification, dir(notification))
# print(notification.queue_config_list)

# （11）设置存储桶的通知配置 -- re_set_bucket_notification(self, notification_config, tag_bucket_name=None)
'''
必传参数
    tag_bucket_name: 目标桶
    notification_config: 通知配置
返回结果
    {'result': False, 'tag_bucket_name': 'test1', 'msg': '目标存储桶 test1 通知配置 设置失败', 'msg_list': [], 'error': S3Error('S3 operation failed; code: InvalidArgument, message: A specified destination ARN does not exist or is not well-formed. Verify the destination ARN., resource: /test1, request_id: 177AD65BCF1969A7, host_id: 901192593c8d4aebefcd5e1ffb207b1846522d03b1e9cb2132c2770ef491581c, bucket_name: test1'), 'notification_config': <minio.notificationconfig.NotificationConfig object at 0x000001DB32814460>}
    

'''
# config = NotificationConfig(
#     queue_config_list=[
#         QueueConfig(
#             "QUEUE-ARN-OF-THIS-BUCKET", # Queue值没搞明白咋获取
#             ["s3:ObjectCreated:*"],
#             config_id="1",
#             prefix_filter_rule=PrefixFilterRule("abc"),
#         ),
#     ],
# )
# tag_bucket_name = 'test1'
# res = bucket.re_set_bucket_notification(tag_bucket_name=tag_bucket_name, notification_config=config)
# print(res)

# （12）移除存储桶上的所有通知 -- re_remove_all_bucket_notifications(self, tag_bucket_name=None)
'''
必传参数
    tag_bucket_name: 目标桶
返回结果


'''

# tag_bucket_name = 'test1'
# res = bucket.re_remove_all_bucket_notifications(tag_bucket_name=tag_bucket_name)
# print(res)


# （13）监听存储桶的通知 -- listen_bucket_notification(self, prefix, suffix, events, tag_bucket_name=None)
'''
必传参数
    prefix: 对象前缀，用于匹配以指定前缀开头的对象。可选参数，默认为空字符串。
    suffix:对象后缀，用于匹配以指定后缀结尾的对象。可选参数，默认为空字符串。
    events: 需要监听的事件类型。可选参数，默认为`s3:ObjectCreated:*`、`s3:ObjectRemoved:*`、`s3:ObjectAccessed:*`三种事件类型。
    tag_bucket_name: 存储桶的名称
返回结果


'''
# prefix = 'documents/'
# suffix = '.pdf'
# events = ('s3:ObjectCreated:*',
#           's3:ObjectRemoved:*',
#           's3:ObjectAccessed:*')
# tag_bucket_name = 'test1'
#
# res = bucket.listen_bucket_notification(tag_bucket_name=tag_bucket_name, prefix=prefix, suffix=suffix, events=events)
# print(res)


##############################文件操作##############################
# （1）创建文件操作对象 -- __init__(self, bucket_obj)
'''
创建文件操作对象，必传参数
    已经初始化的桶对象
    bucket_obj
'''
file = FileOperation(bucket)

# （2）从桶中下载一个对象（支持txt、csv文件）并保存到指定路径 -- load_object(self, save_file_path, tag_file_name, tag_bucket_name=None)
'''
必传参数
    save_file_path: 保存文件的路径
    tag_file_name: 桶中存在的文件名称
    tag_bucket_name: 桶名称
    start: 区间起始位置
    end:  区间结束位置
返回结果
    {'result': True, 'tag_bucket_name': 'test1', 'msg': '目标文件 02.json 下载成功', 'msg_list': []}
    {'result': True, 'tag_bucket_name': 'test1', 'msg': '目标文件 4.png 下载成功', 'msg_list': []}
'''
# save_file_path = r'E:\Old Boy\luffy\luffyCity\luffyCity\libs\MinioPySdk'
# tag_file_name = '4.png'
# # tag_file_name = '02.json'
# tag_bucket_name = 'test1'
# start = 1  # 不建议使用
# end = 10  # 不建议使用
# res = file.load_object(save_file_path=save_file_path, tag_file_name=tag_file_name, tag_bucket_name=tag_bucket_name)
# print(res)

# （2）下载并将文件保存到本地 -- fget_object(self, save_file_path, tag_file_name, tag_bucket_name=None)
'''
必传参数
    save_file_path: 保存文件的路径
    tag_file_name: 桶中存在的文件名称
    tag_bucket_name: 桶名称
返回结果
    {'result': True, 'tag_bucket_name': 'test1', 'msg': '目标文件下载成功', 'msg_list': [], 'addr': 'E:\\Old Boy\\luffy\\luffyCity\\luffyCity\\libs\\MinioPySdk\\4.png'}
'''
# save_file_path = r'E:\Old Boy\luffy\luffyCity\luffyCity\libs\MinioPySdk'
# tag_file_name = '4.png'
# # tag_file_name = '02.json'
# tag_bucket_name = 'test1'
# res = file.fget_object(save_file_path=save_file_path, tag_file_name=tag_file_name, tag_bucket_name=tag_bucket_name)
# print(res)

# （3）拷贝对象存储服务上的源对象到一个新对象 -- get_copy_object(self, start_file_name, end_file_name=None, start_bucket_name=None, end_bucket_name=None)
'''
必传参数，拷贝对象存储服务上的源对象到一个新对象
    start_file_name: 源文件桶的文件名字
    start_bucket_name: 源文件桶对象
    end_file_name: 目标对象桶的文件名字
    end_bucket_name: 目标桶对象
返回结果
{'result': True, 'tag_bucket_name': 'test2', 'msg': '源桶 :>> test4 源文件 :>> 我的.png 目标桶 :>> test2 目标文件 :>> 我的test2.png 拷贝成功', 'msg_list': [], 'copy_result': <minio.helpers.ObjectWriteResult object at 0x000001A27A2124F0>}'''
# 桶名称
# start_bucket_name = 'test4'
# start_file_name = '我的.png'
#
# end_bucket_name = 'test2'
# end_file_name = '我的test2.png'
# res = file.get_copy_object(start_bucket_name=start_bucket_name, start_file_name=start_file_name,
#                            end_bucket_name=end_bucket_name, end_file_name=end_file_name)
# print(res)


# （4）添加一个新的对象到对象存储服务 -- upload_object(self, upload_file_path, tag_bucket_name=None, tag_file_name=None, content_type=None)
'''
必传参数，上传文件
    upload_file_path: 本地上传文件的路径
    tag_bucket_name: 目标存储桶
    tag_file_name:  当前存储文件在存储桶的文件名
    content_type: 存储文件的类型(可根据需要选择) 指定上传的数据类型 "application/json"、"image/jpeg"、"text/plain"等。
返回结果
{'result': True, 'tag_bucket_name': 'test2', 'msg': '目标桶 test2 目标文件 4.png 上传成功', 'msg_list': [], 'download_url': 'http://43.138.48.158:9011/test2/4.png?x-amz-server-side-encryption=AES256&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=7FGId3bewvgBq75Upf0Q%2F20230813%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230813T065837Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=86aaad300db93f2a90abd05c25245f9031c15e787cdacf9d47d93bf953a46e9f'}# 桶名称
'''
# upload_file_path = r'E:\Old Boy\luffy\luffyCity\luffyCity\libs\MinioPySdk\4.png'
# tag_bucket_name = 'test2'
# tag_file_name = '4.png'
# content_type = ''
# res = file.upload_object(upload_file_path=upload_file_path, tag_bucket_name=tag_bucket_name,
#                          tag_file_name=tag_file_name)
# print(res)


# （5）通过文件上传到对象中 -- fput_object(self, tag_file_name=None, tag_bucket_name=None, upload_file_path=None, content_type=None)
'''
必传参数，上传文件
    upload_file_path: 本地上传文件的路径
    tag_bucket_name: 目标存储桶
    tag_file_name:  当前存储文件在存储桶的文件名
    content_type: 存储文件的类型(可根据需要选择) 指定上传的数据类型 "application/json"、"image/jpeg"、"text/plain"等。
返回结果
{'result': True, 'tag_bucket_name': 'test2', 'msg': '目标桶 test2 目标文件 4.png 上传成功', 'msg_list': [], 'download_url': 'http://43.138.48.158:9011/test2/4.png?x-amz-server-side-encryption=AES256&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=7FGId3bewvgBq75Upf0Q%2F20230813%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230813T065837Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=86aaad300db93f2a90abd05c25245f9031c15e787cdacf9d47d93bf953a46e9f'}# 桶名称
'''
# upload_file_path = r'E:\Old Boy\luffy\luffyCity\luffyCity\libs\MinioPySdk\4.png'
# tag_bucket_name = 'test2'
# tag_file_name = '4.png'
# content_type = ''
# res = file.fput_object(upload_file_path=upload_file_path, tag_bucket_name=tag_bucket_name,
#                          tag_file_name=tag_file_name)
# print(res)

# （6）获取对象的元数据 -- re_stat_object(self, tag_bucket_name=None, tag_file_name=None)
'''
必传参数，上传文件
    tag_bucket_name: 目标存储桶
    tag_file_name:  当前存储文件在存储桶的文件名
返回结果
{'result': True, 'tag_bucket_name': 'test2', 'msg': '目标文件 4.png  元数据获取成功', 'msg_list': [], 'stat': <minio.datatypes.Object object at 0x000001B8572023D0>}
'''
# tag_bucket_name = 'test2'
# tag_file_name = '4.png'
# res = file.re_stat_object( tag_bucket_name=tag_bucket_name,tag_file_name=tag_file_name)
# print(res)

# （7）删除对象 -- remove_object(self, tag_file_name=None, tag_bucket_name=None)
'''
必传参数，上传文件
    tag_bucket_name: 目标存储桶
    tag_file_name:  当前存储文件在存储桶的文件名
返回结果
{'result': True, 'tag_bucket_name': 'test2', 'msg': '目标对象 4.png  删除成功', 'msg_list': []}
'''
# tag_bucket_name = 'test2'
# tag_file_name = '4.png'
# res = file.remove_object(tag_bucket_name=tag_bucket_name, tag_file_name=tag_file_name)
# print(res)

# （8）删除存储桶中的多个对象 -- remove_objects(self, tag_bucket_name=None, tag_file_name_list=None)
'''
必传参数，上传文件
    tag_bucket_name: 目标存储桶
    tag_file_name_list:  当前存储文件在存储桶的文件名列表
返回结果
{'result': True, 'tag_bucket_name': 'test2', 'msg': '目标对象 4.png  删除成功', 'msg_list': []}
'''
# tag_bucket_name = 'test2'
# tag_file_name_list = ['1.png', '2.png', '3.png']
# res = file.remove_objects(tag_bucket_name=tag_bucket_name, tag_file_name_list=tag_file_name_list)
# print(res)
